class Game:
    def __init__(self, n=20, turn=True):
        self.n = n
        self.turn = turn

    def print(self):
        print(self.n)

    def make_move(self, m):
        if not (0 < m <= min(3, self.n)):
            raise ValueError(
                f"La mossa {m} non è compresa tra 1 e {min(3, self.n)}"
            )
        self.n -= m
        self.turn = not self.turn
        return self

    def get_state(self):
        if self.n == 0:
            return 1 if self.turn else -1
        return 0

    def minimax(self, turn):
        state = self.get_state()
        if state != 0:
            return state

        best = -2 if turn else 2
        for move in range(1, 4):
            if 0 < move <= min(3, self.n):
                score = Game(self.n, self.turn).make_move(move).minimax(not turn)
                best = max(best, score) if turn else min(best, score)
        return best

    def get_bot_move(self):
        best_score = -2
        best_move = None
        for move in range(1, 4):
            if 0 < move <= min(3, self.n):
                score = Game(self.n, self.turn).make_move(move).minimax(False)
                if score > best_score:
                    best_score = score
                    best_move = move
        return best_move

g = Game()

while g.get_state() == 0:
    bot_move = g.get_bot_move()
    print(f"Bot sceglie: {bot_move}")
    g.make_move(bot_move)

    if g.get_state() != 0:
        break

    g.print()
    human = int(input(">>>   "))
    g.make_move(human)

print("\nFine partita")
print("Vittoria bot" if g.get_state() == 1 else "Vittoria umano")
